
package com.yyf.springboot2.common;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


public class IdWorker {
	
	private static SnowflakeIdWorker worker;
	private static SnowflakeIdWorker worker2;
	
	static{
		worker = new SnowflakeIdWorker();
		worker2 = new SnowflakeIdWorker();
	}
	/**
	 * 
	 * @Description： 生成id
	 * @return
	 * @author:  
	 * @since: 2017年2月9日 下午3:25:32
	 */
	public static synchronized String createId(){
		String id = Long.toString(worker.nextId());
		return id;
	}
	/**
	 * 
	 * @Description： 生成订单id
	 * @return
	 * @author:  
	 * @since: 2017年2月9日 下午3:25:42
	 */
	public static synchronized String createOrderId(){
		String id = Long.toString(worker2.nextId());
		return id;
	}
    /**
     * 格式化时期，去掉年的前两位
     * @param date
     * @return
     */
    public static String formatOrder(Date date){
        SimpleDateFormat f = new SimpleDateFormat("yyMMdd");
        String sDate = f.format(date);
        return sDate;
    }

    /**
     * 通过UUID的hashcode来取值
     * @return
     */
    public static synchronized String getOrderIdByUUIDHashCode(){
//        int machineId = 1;//最大支持1-9个集群机器部署 - 部署每台机器时请自行修改
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if(hashCodeV < 0) {//有可能是负数
            hashCodeV = - hashCodeV;
        }
        // 0 代表前面补充0
        // 10 代表长度为10
        // d 代表参数为正数型
        String date = formatOrder(new Date());
        String orderid = date + String.format("%010d", hashCodeV);
        return orderid;
    }

    /**
     * 根据当前时间戳来取值 - 理论支持1000*1000的并发，实际在二千次时就出现相同的数据
     * @return
     */
    public static synchronized String creatUserIdBySysTime(){
        int machineId = 1;//最大支持1-9个集群机器部署 - 部署每台机器时请自行修改
        String orderId = machineId + (System.currentTimeMillis() + "").substring(1) + (System.nanoTime() + "").substring(7, 10);
        return orderId;
    }
}

